home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / util / a2ps.1 next >
Text File  |  1989-03-16  |  52KB  |  2,094 lines

  1. Path: xanth!lll-winken!ames!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i075:  a2ps - ascii to postscript converter
  5. Message-ID: <12297@swan.ulowell.edu>
  6. Date: 16 Mar 89 19:28:17 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 2083
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: paolucci%snll-arpagw.llnl.gov@lll-lcc.llnl.gov (Sam Paolucci)
  12. Posting-number: Volume 89, Issue 75
  13. Archive-name: util/a2ps.1
  14.  
  15. Below you will find a utility program that I ported from the Unix
  16. world to the Amiga.  It allows to print text files to PostScript
  17. printers.  It is very useful for printing listings and AutoDocs as it
  18. prints two logical pages per page, lines can be numbered, it will
  19. print the file names with date and time.
  20.  
  21. [uuencoded executable included.  VERY nice for printing AutoDocs. ..Bob]
  22.  
  23. #    This is a shell archive.
  24. #    Remove everything above and including the cut line.
  25. #    Then run the rest of the file through sh.
  26. #----cut here-----cut here-----cut here-----cut here----#
  27. #!/bin/sh
  28. # shar:    Shell Archiver
  29. #    Run the following text with /bin/sh to create:
  30. #    Makefile
  31. #    Makefile.unix
  32. #    README
  33. #    a2ps.1
  34. #    a2ps.1.cat
  35. #    a2ps.1.ps
  36. #    a2ps.c
  37. #    a2ps.ps
  38. #    a2ps.uu
  39. # This archive created: Thu Mar 16 14:24:54 1989
  40. cat << \SHAR_EOF > Makefile
  41. CFLAGS    = +L -DHEADER_PS="S:a2ps.ps" -DANSIC
  42.  
  43. OBJS    = a2ps.o
  44.  
  45. a2ps:    $(OBJS)
  46.     ln -o a2ps $(OBJS) -lc32
  47.  
  48.  
  49.  
  50. SHAR_EOF
  51. cat << \SHAR_EOF > Makefile.unix
  52. #
  53. # Description: Makefile to construct and install a2ps. Don't forget
  54. # to give your own values to define variables HEADER_PS and name of
  55. # compiler (see OPTIONS).
  56. #
  57. # File: imag:/users/local/a2ps/Makefile
  58. # Created: Mon Nov 29 14:05:39 1988 by miguel@imag (Miguel Santana)
  59. # Version: 2.0
  60. #
  61.  
  62. # Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
  63. #
  64. # Permission is granted to copy and distribute this file in modified
  65. # or unmodified form, whether for noncommercial or commercial use,
  66. # provided (a) this copyright notice is preserved, (b) no attempt is
  67. # made to restrict redistribution of this file, and (c) this file is
  68. # not distributed as part of any collection whose redistribution is
  69. # restricted by a compilation copyright.
  70. #
  71.  
  72. D    =.
  73.  
  74. O    =.
  75.  
  76. I    =/users/local/a2ps
  77.  
  78. OPTIONS    =-DHEADER_PS="\"$I/a2ps.ps\"" -DUNIX -O
  79.  
  80. OBJS          = a2ps.o
  81.  
  82. all:        a2ps install
  83.  
  84. a2ps:        a2ps.o
  85.         @echo -n "Compiling and linking a2ps ... "
  86.         @cc -o $D/xa2ps a2ps.o
  87.         @echo "done"
  88.  
  89. install:;    @echo -n "Installing a2ps ... "
  90.         @cp xa2ps $I/a2ps
  91.         @cp a2ps.ps $I/a2ps.ps
  92.         @echo "done"
  93.  
  94. clean:;        @rm -f $(OBJS)
  95.  
  96. a2ps.o:;
  97.         cc -c $(OPTIONS) a2ps.c
  98.  
  99. SHAR_EOF
  100. cat << \SHAR_EOF > README
  101. This is a new version of a2ps, a program to format an ascii file for
  102. printing in a postcript printer. As the copyright indicates, this
  103. distribution can be freely redistributed.
  104.  
  105. Initial version was a shell program written by evan@csli (Evan
  106. Kirshenbaum). It was very slow and contained many bugs. The new
  107. version was written in C by Miguel Santana for improve speed 
  108. execution and portability. New features and improvements have
  109. been added.  I just did a simple port to the Amiga.
  110.  
  111.  
  112. Some notes on the distribution:
  113.  
  114.     Installation is done by modifying and executing Makefile included
  115.     in this distribution. You must give your own values to two variables:
  116.     - HEADER_PS   with the included Makefile, a2ps will search S: for
  117.           the file a2ps.ps at execution time.
  118.     - compiler      compiler name, actually one of UNIX, SYSV, ANSIC. Turbo
  119.           C and Microsoft C are considered ANSIC compilers.  On the
  120.           Amiga compile with the ANSIC flag for either Manx C or
  121.           Lattice C compilers.
  122.     a2ps has been successfully ported to Unix 4.3BSD, Unix SystemV, MSDOS,
  123.     and AmigaDOS.
  124.  
  125.  
  126. The a2ps distribution consists of the following files:
  127.  
  128.     README        This message
  129.     Makefile
  130.     a2ps.c        a2ps source
  131.     a2ps.1        a troff manual (man file)
  132.     a2ps.ps        postcript header used by a2ps
  133.  
  134. Decide where you want to keep these files and move it there.
  135. Edit "Makefile" and change the definition of HEADER_PS (to
  136. reflect the full pathname of a2ps.ps) and of compiler name.
  137. To make a2ps do:
  138.  
  139.     make a2ps
  140.  
  141. To install it, do:
  142.  
  143.     make install
  144.  
  145. Format the manual entry using
  146.  
  147.     nroff -man a2ps.1
  148.  
  149.  
  150. Please send problems and feedback to:
  151.  
  152.     miguel@imag.fr or miguel@imag.UUCP (uunet.uu.net!imag!miguel)
  153.  
  154.     Miguel SANTANA
  155.     LGI
  156.     IMAG-Campus
  157.     BP 53X
  158.     38041 Grenoble Cedex
  159.  
  160. For the Amiga version contact:
  161.  
  162.     paolucci@snll-arpagw.llnl.gov
  163.  
  164.     Dr. Samuel Paolucci
  165.     1351 Roselli Dr.
  166.     Livermore, CA 94550
  167. SHAR_EOF
  168. cat << \SHAR_EOF > a2ps.1
  169. .\" @(#)a2ps.man.1 2.0 11/29/88
  170. .\"
  171. .TH A2PS 1L "November 29 1988"
  172. .UC 4
  173. .SH NAME
  174. a2ps \- formats an ascii file for printing in a postscript printer;
  175. very nice and compact format for program listings.
  176. .SH SYNOPSIS
  177. .B a2ps
  178. [ -b ] [ -f ] [ -i ] [ -n ] [ -n{bfinrv} ] [ -r ] [ -v ] [
  179. .B file1
  180. ] [
  181. .B file2
  182. ] [...]
  183. .SH DESCRIPTION
  184. .B a2ps
  185. formats files "file1", "file2", ... for printing in a postscript printer;
  186. if no file is given,
  187. .B a2ps
  188. reads from the standard input.
  189. Format used is very nice and compact: two pages on each physical page,
  190. borders surrounding pages, headers with useful information (page number,
  191. printing date, file name), line numbering, etc. Very useful to
  192. archive listings of programs.
  193. .PP
  194. Options offered by
  195. .B a2ps
  196. are the following:
  197. .TP 0.6i
  198. .B -b
  199. Force printing binary files. By default, binary files printing is
  200. stopped before second page (see -nb option).
  201. .TP 0.6i
  202. .B -f
  203. Fold lines too large to be printed inside the borders (default option).
  204. Max size is actually 86 characters.
  205. .TP 0.6i
  206. .B -i
  207. Interpret TAB, BS and FF characters (default option). TAB is replaced by
  208. enough spaces to reach next tab stop while BS and FF have their meanings.
  209. .TP 0.6i
  210. .B -n
  211. Output lines are preceded by line numbers, numbered sequentially from 1
  212. (default option).
  213. .TP 0.6i
  214. .B -nb
  215. Don't print binary files. To detect such a file we make use of a
  216. very simple heuristic: if the first page of the file contains at
  217. less 75% of non-printing characters, it's a binary file. First page
  218. is always printed.
  219. .TP 0.6i
  220. .B -nf
  221. Cut lines too large (don't fold).
  222. .TP 0.6i
  223. .B -ni
  224. Don't interpret TAB, BS and FF characters. They will be printed
  225. according to -v option.
  226. .TP 0.6i
  227. .B -nn
  228. Don't number output lines.
  229. .TP 0.6i
  230. .B -nr
  231. Sheet numbering (see -r option) must be continue for all files (don't
  232. reset on new file).
  233. .TP 0.6i
  234. .B -nv
  235. Replace non-printing characters by a space.
  236. .TP 0.6i
  237. .B -r
  238. Reset sheet numbering for each new file (default option). Sheet numbering
  239. is used to number physical pages (sheets printed) and is placed
  240. in the bottom of each physical page. It differs from page numbering: logical
  241. pages of file been printed.
  242. .TP 0.6i
  243. .B -v
  244. Replace non-printing characters so that they are lisible and easy to identify
  245. (default option). Control characters (ascii codes lower than 0x20) are
  246. printed like ^X for ctrl-x; the delete character (hex 0x3f) is printed
  247. as ^?. Non ascii characters (with the high bit set) are printed as M-
  248. (for meta) followed by the character of the low 7 bits. TAB, BS and FF are
  249. handled like non-printing characters if -ni option was taked.
  250. .SH USAGE
  251. .PP
  252. .B a2ps
  253. sends formatted file to standard output. User could redirect this output
  254. to a file or pipe it directly to a print command, like lpr in UNIX:
  255.  
  256. .ti +0.5i
  257. a2ps file1 > file2
  258.  
  259. .ti +0.5i
  260. a2ps file1 | lpr -l
  261. .PP
  262. Don't forget
  263. .B -l
  264. option in last line, if you want that 
  265. .B lpr
  266. interprets your postscript program.
  267. .PP
  268. This filter must be used only with text files. Avoid specially output from
  269. TeX, troff or any other text formatter.
  270. .SH "SEE ALSO"
  271. pprps(1L) tgrind(1) lpr(1)
  272. .SH AUTHORS
  273. Evan Kirshenbaum (evan@csli) for the initial version.
  274. .br
  275. Miguel Santana (miguel@imag.imag.fr) for 2.0 version.
  276. SHAR_EOF
  277. cat << \SHAR_EOF > a2ps.1.cat
  278.  
  279.  
  280.  
  281.                                                          A2PS(1L)
  282.  
  283.  
  284.  
  285. NAME
  286.      a2ps - formats an ascii file for printing in a postscript
  287.      printer; very nice and compact format for program listings.
  288.  
  289. SYNOPSIS
  290.      a2ps [ -b ] [ -f ] [ -i ] [ -n ] [ -n{bfinrv} ] [ -r ] [ -v
  291.      ] [ file1 ] [ file2 ] [...]
  292.  
  293. DESCRIPTION
  294.      a2ps formats files "file1", "file2", ... for printing in a
  295.      postscript printer; if no file is given, a2ps reads from the
  296.      standard input.  Format used is very nice and compact: two
  297.      pages on each physical page, borders surrounding pages,
  298.      headers with useful information (page number, printing date,
  299.      file name), line numbering, etc. Very useful to archive
  300.      listings of programs.
  301.  
  302.      Options offered by a2ps are the following:
  303.  
  304.      -b    Force printing binary files. By default, binary files
  305.            printing is stopped before second page (see -nb
  306.            option).
  307.  
  308.      -f    Fold lines too large to be printed inside the borders
  309.            (default option).  Max size is actually 86 characters.
  310.  
  311.      -i    Interpret TAB, BS and FF characters (default option).
  312.            TAB is replaced by enough spaces to reach next tab
  313.            stop while BS and FF have their meanings.
  314.  
  315.      -n    Output lines are preceded by line numbers, numbered
  316.            sequentially from 1 (default option).
  317.  
  318.      -nb   Don't print binary files. To detect such a file we
  319.            make use of a very simple heuristic: if the first page
  320.            of the file contains at less 75% of non-printing char-
  321.            acters, it's a binary file. First page is always
  322.            printed.
  323.  
  324.      -nf   Cut lines too large (don't fold).
  325.  
  326.      -ni   Don't interpret TAB, BS and FF characters. They will
  327.            be printed according to -v option.
  328.  
  329.      -nn   Don't number output lines.
  330.  
  331.      -nr   Sheet numbering (see -r option) must be continue for
  332.            all files (don't reset on new file).
  333.  
  334.      -nv   Replace non-printing characters by a space.
  335.  
  336.      -r    Reset sheet numbering for each new file (default
  337.  
  338.  
  339.  
  340.                                                                 1
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347. A2PS(1L)
  348.  
  349.  
  350.  
  351.            option). Sheet numbering is used to number physical
  352.            pages (sheets printed) and is placed in the bottom of
  353.            each physical page. It differs from page numbering:
  354.            logical pages of file been printed.
  355.  
  356.      -v    Replace non-printing characters so that they are lisi-
  357.            ble and easy to identify (default option). Control
  358.            characters (ascii codes lower than 0x20) are printed
  359.            like ^X for ctrl-x; the delete character (hex 0x3f) is
  360.            printed as ^?. Non ascii characters (with the high bit
  361.            set) are printed as M- (for meta) followed by the
  362.            character of the low 7 bits. TAB, BS and FF are han-
  363.            dled like non-printing characters if -ni option was
  364.            taked.
  365.  
  366. USAGE
  367.      a2ps sends formatted file to standard output. User could
  368.      redirect this output to a file or pipe it directly to a
  369.      print command, like lpr in UNIX:
  370.  
  371.           a2ps file1 > file2
  372.  
  373.           a2ps file1 | lpr -l
  374.  
  375.      Don't forget -l option in last line, if you want that lpr
  376.      interprets your postscript program.
  377.  
  378.      This filter must be used only with text files. Avoid spe-
  379.      cially output from TeX, troff or any other text formatter.
  380.  
  381. SEE ALSO
  382.      pprps(1L) tgrind(1) lpr(1)
  383.  
  384. AUTHORS
  385.      Evan Kirshenbaum (evan@csli) for the initial version.
  386.      Miguel Santana (miguel@imag.imag.fr) for 2.0 version.
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406. 2
  407.  
  408.  
  409.  
  410. SHAR_EOF
  411. cat << \SHAR_EOF > a2ps.1.ps
  412. %!PS-Adobe-1.0
  413. %%Creator: waterworks:paolucci (Sam Paolucci)
  414. %%Title: stdin
  415. %%CreationDate: Thu Jan 19 07:42:19 1989
  416. %%DocumentFonts: Times-Roman Times-Italic Times-Bold Symbol Times-Roman
  417. %%Pages: (atend)
  418. %%EndComments
  419. % lib/pscat.pro -- prolog for pscat (troff) files
  420. % Copyright (C) 1985 Adobe Systems, Inc.
  421. % Added defs for Manual Feed 
  422. save /pscatsave exch def
  423. /$pscat 50 dict def
  424. $pscat begin
  425. /fm [1 0 0 1 0 0] def
  426. /xo 0 def /yo 0 def
  427. /M /moveto load def
  428. /R /show load def
  429. /S {exch currentpoint exch pop moveto show}def
  430. /T {exch currentpoint pop exch moveto show}def
  431. /U {3 1 roll moveto show}def
  432. /siz 0 def
  433. /font 0 def
  434. /Z {/siz exch def SF}def
  435. /F {/font exch def SF}def
  436. /SF{font 0 ne
  437.     {catfonts font 1 sub get fm 0 siz put fm 3 siz neg put 
  438.      fm makefont setfont}if}def
  439. /BP{save/catsv exch def 0 792 translate 72 432 div dup neg scale 
  440.   xo yo translate 0 0 moveto}def
  441. /BPL{save/catsv exch def 72 8.25 mul 792 translate -90 rotate
  442.   72 432 div dup neg scale xo yo translate 0 0 moveto}def
  443. /EP{catsv restore showpage}def
  444. /SetStTime{statusdict /manualfeedtimeout 120 put} def
  445. /SetStatus{statusdict /manualfeed true put
  446.    statusdict /product get (LaserWriter) eq 
  447.    {version (23.0) eq  % Don't redefine EP if printer is not "Classic LW"
  448.      {/EP {catsv restore
  449.      {statusdict /printerstatus get exec 16#22000000 and 0 eq{exit}if}loop
  450.      showpage}def}if }if}def
  451. % definitions for PPROC callback functions
  452. % each PPROC is called with the following number on the stack:
  453. % pointsize charcode railmag pswidth pschar x y wid
  454. /$pprocs 50 dict def
  455. /fractm [.65 0 0 .6 0 0] def
  456. % fractions
  457. /PS1{gsave $pprocs begin
  458.     /wid exch def pop pop pop pop pop /ch exch def /size exch def
  459.     /pair $pprocs ch get def /cf currentfont def
  460.     cf fractm makefont setfont
  461.     0 .3 size mul 6 mul 2 copy neg rmoveto pair 0 get show rmoveto
  462.     currentfont cf setfont (\244) show setfont
  463.     pair 1 get show grestore wid .06 div 0 rmoveto end}def
  464. $pprocs begin
  465. 8#34 [(1)(4)] def
  466. 8#36 [(1)(2)] def
  467. 8#46 [(3)(4)] def
  468. end
  469. % boxes
  470. /PS2{gsave /wid exch def pop pop /char exch def pop pop pop /size exch def
  471.     /len size 3.5 mul def % length of a side
  472.     len 0 rlineto 0 len neg rlineto len neg 0 rlineto closepath
  473.     char 3 eq {fill}{size 5 mul .07 mul setlinewidth stroke}ifelse
  474.     grestore wid .06 div 0 rmoveto}def
  475. /PS3/PS2 load def        % boxes are the same...
  476. % circle
  477. /PS4{gsave /wid exch def pop pop pop pop pop pop /size exch def
  478.     wid .8333 mul size 2.5 mul neg rmoveto currentpoint    % center
  479.     newpath size 1.8 mul 0 360 arc size .2 mul setlinewidth stroke
  480.     grestore wid .06 div 0 rmoveto}def
  481. /bb{$pprocs begin /wid exch def pop pop pop pop pop pop /size exch 6 mul def
  482.     /s2 size 2 div def /s4 size 4 div def gsave 
  483.     currentpoint newpath transform round exch round exch itransform translate
  484.     size 16 div setlinewidth 2 setlinejoin 0 setgray}def
  485. $pprocs begin
  486. /mrr{moveto rlineto rlineto}def
  487. /be{stroke grestore wid .06 div 0 rmoveto end}def
  488. end
  489. % leftfloor
  490. /PS6 {bb s4 0 0 size s4 size -.8 mul mrr be}def
  491. % rightfloor
  492. /PS7 {bb s4 neg 0 0 size s4 size -.8 mul mrr be}def
  493. % leftceil
  494. /PS8 {bb s4 0 0 size neg s4 size .2 mul mrr be}def
  495. % rightceil
  496. /PS9 {bb s4 neg 0 0 size neg s4 size .2 mul mrr be}def
  497. % boldvert
  498. /PS5 {bb 0 0 0 size neg s4 size .2 mul mrr be}def
  499. % box rule
  500. /PS32 {bb /sw size 24 div def sw 2 div size 4.5 div moveto
  501.        0 size neg rlineto sw setlinewidth be}def
  502. % rule (roman, bold and italic)
  503. /PS16 {gsave $pprocs begin
  504.     /wid exch def pop pop pop pop pop pop /size exch 6 mul def
  505.     /sw size 14 div def currentpoint exch sw 2 div sub exch
  506.     newpath transform round exch round exch itransform translate
  507.     0 0 moveto size 2 div 0 rlineto sw setlinewidth be}def
  508. % lefttopcurl    
  509. /PS20 {bb s4 size .2 mul moveto 0 size -.55 mul rlineto currentpoint 
  510.     pop size -.8 mul 2 copy exch s4 add exch s4 arcto pop pop pop pop be}def
  511. % leftbotcurl
  512. /PS21 {bb s4 size -.8 mul moveto 0 size .55 mul rlineto currentpoint 
  513.     pop size .2 mul 2 copy exch s4 add exch s4 arcto pop pop pop pop be}def
  514. % righttopcurl
  515. /PS22 {bb s4 size .2 mul moveto 0 size -.55 mul rlineto currentpoint
  516.      pop size -.8 mul 2 copy exch s4 sub exch s4 arcto pop pop pop pop be}def
  517. % rightbotcurl
  518. /PS23 {bb s4 size -.8 mul moveto 0 size .55 mul rlineto currentpoint
  519.      pop size .2 mul 2 copy exch s4 sub exch s4 arcto pop pop pop pop be}def
  520. % rightmidcurl
  521. /PS25 {bb /s3 size -.3 mul def s4 size -.8 mul moveto s4 s3 s2 s3
  522.     s4 arcto pop pop size add s4 s3 4 2 roll
  523.     s4 arcto pop pop pop pop s4 size .2 mul lineto be}def
  524. % leftmidcurl
  525. /PS24 {bb /s3 size -.3 mul def s4 size -.8 mul moveto s4 s3 0 s3
  526.     s4 arcto pop pop size add s4 s3 4 2 roll s4 arcto pop pop pop pop 
  527.     s4 size .2 mul lineto be}def
  528. /xo 216 def /yo 0 def
  529. /catfonts [
  530.     /Times-Roman findfont
  531.     /Times-Italic findfont
  532.     /Times-Bold findfont
  533.     /Symbol findfont
  534.     /Times-Roman findfont
  535.     ] def
  536. %%EndProlog
  537. %%Page: ? 1
  538. BP
  539. 1 F
  540. 60 Z
  541. 270 381(A2PS)U
  542. 419(\()S
  543. 449(1L)S
  544. 526(\))S
  545. 1166(MISC.)S
  546. 1347(REFERENCE)S
  547. 1711(MANUAL)S
  548. 1993(PAGES)S
  549. 2802(A2PS)S
  550. 2951(\()S
  551. 2981(1L)S
  552. 3058(\))S
  553. 3 F
  554. 54 Z
  555. 270 669(NAME)U
  556. 1 F
  557. 60 Z
  558. 486 741(a2ps)U
  559. 621(\261)S
  560. 676(formats)S
  561. 885(an)S
  562. 967(ascii)S
  563. 1103(\256le)S
  564. 1205(for)S
  565. 1300(printing)S
  566. 1516(in)S
  567. 1588(a)S
  568. 1640(postscript)S
  569. 1899(printer;)S
  570. 2102(very)S
  571. 2234(nice)S
  572. 2359(and)S
  573. 2470(compact)S
  574. 2699(format)S
  575. 2884(for)S
  576. 2978(pro-)S
  577. 486 813(gram)U
  578. 630(listings.)S
  579. 3 F
  580. 54 Z
  581. 504 912(S)U
  582. 270(SYNOPSI)S
  583. 60 Z
  584. 486 984(a2ps)U
  585. 1 F
  586. 622([)S
  587. 662(-b)S
  588. 732(])S
  589. 772([)S
  590. 812(-f)S
  591. 872(])S
  592. 912([)S
  593. 952(-i)S
  594. 1009(])S
  595. 1049([)S
  596. 1089(-n)S
  597. 1159(])S
  598. 1199([)S
  599. 1239(-n)S
  600. 5 F
  601. ({)R
  602. 1 F
  603. (b\256nrv)R
  604. 5 F
  605. (})R
  606. 1 F
  607. 1508(])S
  608. 1548([)S
  609. 1588(-r)S
  610. 1648(])S
  611. 1688([)S
  612. 1728(-v)S
  613. 1798(])S
  614. 1838([)S
  615. 3 F
  616. 1878(\256le1)S
  617. 1 F
  618. 2005(])S
  619. 2045([)S
  620. 3 F
  621. 2085(\256le2)S
  622. 1 F
  623. 2212(])S
  624. 2252([...])S
  625. 3 F
  626. 54 Z
  627. 270 1083(DESCRIPTION)U
  628. 60 Z
  629. 486 1155(a2ps)U
  630. 1 F
  631. 627(formats)S
  632. 836(\256les)S
  633. 5 F
  634. 961(")S
  635. 1 F
  636. (\256le1)R
  637. 5 F
  638. (")R
  639. 1 F
  640. (,)R
  641. 5 F
  642. 1158(")S
  643. 1 F
  644. (\256le2)R
  645. 5 F
  646. (")R
  647. 1 F
  648. (,)R
  649. 1355(...)S
  650. 1425(for)S
  651. 1520(printing)S
  652. 1736(in)S
  653. 1808(a)S
  654. 1860(postscript)S
  655. 2119(printer;)S
  656. 2322(if)S
  657. 2384(no)S
  658. 2469(\256le)S
  659. 2571(is)S
  660. 2636(given,)S
  661. 3 F
  662. 2810(a2ps)S
  663. 1 F
  664. 2951(reads)S
  665. 3063 1227(,)U
  666. 486 1299(b)U
  667. 486 1227(from)U
  668. 633(the)S
  669. 737(standard)S
  670. 971(input.)S
  671. 1160(Format)S
  672. 1364(used)S
  673. 1503(is)S
  674. 1572(very)S
  675. 1708(nice)S
  676. 1838(and)S
  677. 1954(compact:)S
  678. 2205(two)S
  679. 2324(pages)S
  680. 2490(on)S
  681. 2579(each)S
  682. 2719(physical)S
  683. 2949(page)S
  684. 516 1299(orders)U
  685. 687(surrounding)S
  686. 998(pages,)S
  687. 1171(headers)S
  688. 1376(with)S
  689. 1504(useful)S
  690. 1672(information)S
  691. 1978(\(page)S
  692. 2133(number,)S
  693. 2353(printing)S
  694. 2565(date,)S
  695. 2702(\256le)S
  696. 2800(name\),)S
  697. 2987(line)S
  698. 486 1470(O)U
  699. 486 1371(numbering,)U
  700. 782(etc.)S
  701. 888(Very)S
  702. 1028(useful)S
  703. 1195(to)S
  704. 1262(archive)S
  705. 1460(listings)S
  706. 1654(of)S
  707. 1724(programs.)S
  708. 529 1470(ptions)U
  709. 696(offered)S
  710. 890(by)S
  711. 3 F
  712. 970(a2ps)S
  713. 1 F
  714. 1106(are)S
  715. 1200(the)S
  716. 1294(following:)S
  717. 3 F
  718. 486 1569(-)U
  719. (b)R
  720. 1 F
  721. 745(Force)S
  722. 911(printing)S
  723. 1131(binary)S
  724. 1314(\256les.)S
  725. 1458(By)S
  726. 1557(default,)S
  727. 1769(binary)S
  728. 1952(\256les)S
  729. 2081(printing)S
  730. 2301(is)S
  731. 2370(stopped)S
  732. 2586(before)S
  733. 2769(second)S
  734. 2964(page)S
  735. 3 F
  736. 486 1740(-)U
  737. 1 F
  738. 745 1641(\(see)U
  739. 862(-nb)S
  740. 962(option\).)S
  741. 3 F
  742. 506 1740(f)U
  743. 1 F
  744. 745(Fold)S
  745. 877(lines)S
  746. 1013(too)S
  747. 1112(large)S
  748. 1255(to)S
  749. 1324(be)S
  750. 1403(printed)S
  751. 1596(inside)S
  752. 1762(the)S
  753. 1858(borders)S
  754. 2059(\(default)S
  755. 2268(option\).)S
  756. 2498(Max)S
  757. 2629(size)S
  758. 2744(is)S
  759. 2805(actuall)S
  760. 2967(y)S
  761. 3018(86)S
  762. 3 F
  763. 486 1911(-)U
  764. 1 F
  765. 745 1812(charact)U
  766. 920(ers.)S
  767. 3 F
  768. 506 1911(i)U
  769. 1 F
  770. 745(Interpret)S
  771. 977(TAB,)S
  772. 1136(BS)S
  773. 1233(and)S
  774. 1344(FF)S
  775. 1434(charact)S
  776. 1609(ers)S
  777. 1703(\(default)S
  778. 1915(option\).)S
  779. 2128(TAB)S
  780. 2272(is)S
  781. 2336(replace)S
  782. 2511(d)S
  783. 2565(by)S
  784. 2649(enough)S
  785. 2850(spaces)S
  786. 3031(to)S
  787. 3 F
  788. 486 2082(-)U
  789. 1 F
  790. 745 1983(reach)U
  791. 896(next)S
  792. 1020(tab)S
  793. 1114(stop)S
  794. 1234(while)S
  795. 1388(BS)S
  796. 1481(and)S
  797. 1588(FF)S
  798. 1674(have)S
  799. 1808(their)S
  800. 1939(meanings.)S
  801. 3 F
  802. 506 2082(n)U
  803. 1 F
  804. 745(Output)S
  805. 932(lines)S
  806. 1066(are)S
  807. 1160(preceded)S
  808. 1398(by)S
  809. 1478(line)S
  810. 1589(numbers,)S
  811. 1831(numbered)S
  812. 2092(sequentiall)S
  813. 2354(y)S
  814. 2404(from)S
  815. 2541(1)S
  816. 2591(\(default)S
  817. 2799(option\).)S
  818. 3051 2181(e)U
  819. 3 F
  820. 486(-nb)S
  821. 1 F
  822. 745(Don't)S
  823. 909(print)S
  824. 1047(binary)S
  825. 1225(\256les.)S
  826. 1364(To)S
  827. 1455(detect)S
  828. 1624(such)S
  829. 1758(a)S
  830. 1809(\256le)S
  831. 1909(we)S
  832. 2002(make)S
  833. 2156(use)S
  834. 2259(of)S
  835. 2332(a)S
  836. 2382(very)S
  837. 2512(simple)S
  838. 2696(heuristic:)S
  839. 2944(if)S
  840. 3004(th)S
  841. 745 2253(\256rst)U
  842. 864(page)S
  843. 1004(of)S
  844. 1080(the)S
  845. 1180(\256le)S
  846. 1283(contains)S
  847. 1510(at)S
  848. 1580(less)S
  849. 1696(75%)S
  850. 1832(of)S
  851. 1907(non-printing)S
  852. 2233(charact)S
  853. 2408(ers,)S
  854. 2518(it's)S
  855. 2620(a)S
  856. 2672(binary)S
  857. 2851(\256le.)S
  858. 2968(First)S
  859. 3 F
  860. 486 2424(-)U
  861. 1 F
  862. 745 2325(page)U
  863. 879(is)S
  864. 939(always)S
  865. 1126(printed.)S
  866. 3 F
  867. 506 2424(nf)U
  868. 1 F
  869. 745(Cut)S
  870. 852(lines)S
  871. 986(too)S
  872. 1083(large)S
  873. 1224(\(don't)S
  874. 1391(fold\).)S
  875. 3 F
  876. 486 2523(-)U
  877. (ni)R
  878. 1 F
  879. 745(Don't)S
  880. 905(interpret)S
  881. 1130(TAB,)S
  882. 1285(BS)S
  883. 1378(and)S
  884. 1485(FF)S
  885. 1571(charact)S
  886. 1746(ers.)S
  887. 1851(They)S
  888. 1995(will)S
  889. 2109(be)S
  890. 2186(printed)S
  891. 2377(according)S
  892. 2635(to)S
  893. 2702(-v)S
  894. 2772(option.)S
  895. 3 F
  896. 486 2721(-)U
  897. 486 2622(-nn)U
  898. 1 F
  899. 745(Don't)S
  900. 905(number)S
  901. 1109(output)S
  902. 1283(lines.)S
  903. 3 F
  904. 506 2721(nr)U
  905. 1 F
  906. 745(Sheet)S
  907. 899(numbering)S
  908. 1180(\(see)S
  909. 1297(-r)S
  910. 1357(option\))S
  911. 1551(must)S
  912. 1688(be)S
  913. 1765(continue)S
  914. 1993(for)S
  915. 2083(all)S
  916. 2164(\256les)S
  917. 2284(\(don't)S
  918. 2451(reset)S
  919. 2585(on)S
  920. 2665(new)S
  921. 2785(\256le\).)S
  922. 3 F
  923. 486 2919(-)U
  924. 486 2820(-nv)U
  925. 1 F
  926. 745(Replace)S
  927. 960(non-printing)S
  928. 1281(charact)S
  929. 1456(ers)S
  930. 1546(by)S
  931. 1626(a)S
  932. 1673(space.)S
  933. 3 F
  934. 506 2919(r)U
  935. 1 F
  936. 745(Reset)S
  937. 901(sheet)S
  938. 1047(numbering)S
  939. 1330(for)S
  940. 1422(each)S
  941. 1555(new)S
  942. 1677(\256le)S
  943. 1776(\(default)S
  944. 1986(option\).)S
  945. 2197(Sheet)S
  946. 2352(numbering)S
  947. 2634(is)S
  948. 2695(used)S
  949. 2826(to)S
  950. 2894(number)S
  951. 745 3063(f)U
  952. 745 2991(physical)U
  953. 971(pages)S
  954. 1133(\(sheets)S
  955. 1325(printed\))S
  956. 1541(and)S
  957. 1653(is)S
  958. 1718(placed)S
  959. 1901(in)S
  960. 1973(the)S
  961. 2072(bottom)S
  962. 2268(of)S
  963. 2343(each)S
  964. 2479(physical)S
  965. 2705(page.)S
  966. 2859(It)S
  967. 2921(differs)S
  968. 765 3063(rom)U
  969. 882(page)S
  970. 1016(numbering:)S
  971. 1314(logical)S
  972. 1499(pages)S
  973. 1656(of)S
  974. 1726(\256le)S
  975. 1823(been)S
  976. 1957(printed.)S
  977. 3063 3162(.)U
  978. 3 F
  979. 486(-v)S
  980. 1 F
  981. 745(Replace)S
  982. 965(non-printing)S
  983. 1291(charact)S
  984. 1466(ers)S
  985. 1561(so)S
  986. 1639(that)S
  987. 1754(they)S
  988. 1882(are)S
  989. 1980(lisible)S
  990. 2152(and)S
  991. 2263(easy)S
  992. 2394(to)S
  993. 2465(identify)S
  994. 2677(\(default)S
  995. 2889(option\))S
  996. 745 3234(Control)U
  997. 959(charact)S
  998. 1134(ers)S
  999. 1234(\(ascii)S
  1000. 1395(codes)S
  1001. 1562(lower)S
  1002. 1729(than)S
  1003. 1863(0x20\))S
  1004. 2033(are)S
  1005. 2137(printed)S
  1006. 2338(like)S
  1007. 5 F
  1008. 2459(\303)S
  1009. 1 F
  1010. (X)R
  1011. 2552(for)S
  1012. 2652(ctrl-x;)S
  1013. 2830(the)S
  1014. 2933(delete)S
  1015. 745 3378(a)U
  1016. 745 3306(charact)U
  1017. 920(er)S
  1018. 992(\(hex)S
  1019. 1124(0x3f\))S
  1020. 1279(is)S
  1021. 1344(printed)S
  1022. 1539(as)S
  1023. 5 F
  1024. 1613(\303)S
  1025. 1 F
  1026. (?.)R
  1027. 1699(Non)S
  1028. 1826(ascii)S
  1029. 1961(charact)S
  1030. 2136(ers)S
  1031. 2230(\(with)S
  1032. 2381(the)S
  1033. 2479(high)S
  1034. 2610(bit)S
  1035. 2698(set\))S
  1036. 2809(are)S
  1037. 2907(printed)S
  1038. 772 3378(s)U
  1039. 820(M-)S
  1040. 918(\(for)S
  1041. 1033(meta\))S
  1042. 1196(followed)S
  1043. 1435(by)S
  1044. 1520(the)S
  1045. 1619(charact)S
  1046. 1794(er)S
  1047. 1866(of)S
  1048. 1940(the)S
  1049. 2038(low)S
  1050. 2152(7)S
  1051. 2206(bits.)S
  1052. 2332(TAB,)S
  1053. 2491(BS)S
  1054. 2588(and)S
  1055. 2699(FF)S
  1056. 2789(are)S
  1057. 2887(handled)S
  1058. 3 F
  1059. 54 Z
  1060. 270 3549(USAGE)U
  1061. 1 F
  1062. 60 Z
  1063. 745 3450(like)U
  1064. 856(non-printing)S
  1065. 1177(charact)S
  1066. 1352(ers)S
  1067. 1442(if)S
  1068. 1499(-ni)S
  1069. 1586(option)S
  1070. 1760(was)S
  1071. 1873(taked.)S
  1072. 3 F
  1073. 486 3621(a2ps)U
  1074. 1 F
  1075. 625(sends)S
  1076. 781(formatted)S
  1077. 1039(\256le)S
  1078. 1139(to)S
  1079. 1209(standard)S
  1080. 1436(output.)S
  1081. 1628(User)S
  1082. 1764(could)S
  1083. 1921(redirect)S
  1084. 2129(this)S
  1085. 2239(output)S
  1086. 2416(to)S
  1087. 2486(a)S
  1088. 2536(\256le)S
  1089. 2636(or)S
  1090. 2709(pipe)S
  1091. 2836(it)S
  1092. 2893(directly)S
  1093. 486 3693(to)U
  1094. 553(a)S
  1095. 600(print)S
  1096. 734(command,)S
  1097. 1007(like)S
  1098. 1118(lpr)S
  1099. 1205(in)S
  1100. 1272(UNIX:)S
  1101. 702 3837(a2ps)U
  1102. 832(\256le1)S
  1103. 4 F
  1104. 959(>)S
  1105. 1 F
  1106. 1012(\256le2)S
  1107. 1098 3981(l)U
  1108. 486 4080(D)U
  1109. 702 3981(a2ps)U
  1110. 832(\256le1)S
  1111. 959(|)S
  1112. 991(lpr)S
  1113. 1078(-)S
  1114. 529 4080(on't)U
  1115. 646(forget)S
  1116. 3 F
  1117. 810(-l)S
  1118. 1 F
  1119. 867(option)S
  1120. 1041(in)S
  1121. 1108(last)S
  1122. 1212(line,)S
  1123. 1338(if)S
  1124. 1395(you)S
  1125. 1505(want)S
  1126. 1642(that)S
  1127. 3 F
  1128. 1753(lpr)S
  1129. 1 F
  1130. 1850(interprets)S
  1131. 2098(your)S
  1132. 2228(postscript)S
  1133. 2482(program.)S
  1134. 3061 4179(t)U
  1135. 486 4251(f)U
  1136. 486 4179(This)U
  1137. 618(\256lter)S
  1138. 757(must)S
  1139. 899(be)S
  1140. 981(used)S
  1141. 1116(only)S
  1142. 1248(with)S
  1143. 1380(text)S
  1144. 1496(\256les.)S
  1145. 1636(Avoid)S
  1146. 1811(specially)S
  1147. 2051(output)S
  1148. 2230(from)S
  1149. 2372(TeX,)S
  1150. 2519(troff)S
  1151. 2651(or)S
  1152. 2726(any)S
  1153. 2838(other)S
  1154. 2987(tex)S
  1155. 506 4251(ormatter.)U
  1156. 270 4701(S)U
  1157. (un)R
  1158. 383(Release)S
  1159. 591(4.0)S
  1160. 1271(Last)S
  1161. 1395(change:)S
  1162. 1603(November)S
  1163. 1877(29)S
  1164. 1957(1988)S
  1165. 3048(1)S
  1166. EP
  1167. %%Page: ? 2
  1168. BP
  1169. 1 F
  1170. 60 Z
  1171. 3058 381(\))U
  1172. 3 F
  1173. 54 Z
  1174. 270 669(S)U
  1175. 1 F
  1176. 60 Z
  1177. 270 381(A2PS)U
  1178. 419(\()S
  1179. 449(1L)S
  1180. 526(\))S
  1181. 1166(MISC.)S
  1182. 1347(REFERENCE)S
  1183. 1711(MANUAL)S
  1184. 1993(PAGES)S
  1185. 2802(A2PS)S
  1186. 2951(\()S
  1187. 2981(1L)S
  1188. 3 F
  1189. 54 Z
  1190. 300 669(EE)U
  1191. 390(ALSO)S
  1192. 1 F
  1193. 60 Z
  1194. 486 741(p)U
  1195. (prps\(1L\))R
  1196. 746(tgrind\(1\))S
  1197. 980(lpr\(1\))S
  1198. 3 F
  1199. 54 Z
  1200. 270 840(AUTHORS)U
  1201. 1 F
  1202. 60 Z
  1203. 486 912(Evan)U
  1204. 630(Kirshenbaum)S
  1205. 974(\(evan)S
  1206. 5 F
  1207. (@)R
  1208. 1 F
  1209. (csli\))R
  1210. 1287(for)S
  1211. 1377(the)S
  1212. 1471(initial)S
  1213. 1633(version.)S
  1214. 1848 984(.)U
  1215. 270 4701(S)U
  1216. 486 984(Miguel)U
  1217. 680(Santana)S
  1218. 891(\(miguel)S
  1219. 5 F
  1220. (@)R
  1221. 1 F
  1222. (ima)R
  1223. 1225(g.imag.fr\))S
  1224. 1486(for)S
  1225. 1576(2.0)S
  1226. 1671(version)S
  1227. 303 4701(un)U
  1228. 383(Release)S
  1229. 591(4.0)S
  1230. 1271(Last)S
  1231. 1395(change:)S
  1232. 1603(November)S
  1233. 1877(29)S
  1234. 1957(1988)S
  1235. 3048(2)S
  1236. EP
  1237. %%Trailer
  1238. pscatsave end restore
  1239. %%Pages: 2
  1240. SHAR_EOF
  1241. cat << \SHAR_EOF > a2ps.c
  1242. /************************************************************************/
  1243. /*                                    */
  1244. /* Description: Ascii to PostScript printer program.            */
  1245. /* File: imag:/users/local/a2ps/a2ps.c                    */
  1246. /* Created: Mon Nov 28 15:22:15 1988 by miguel@imag (Miguel Santana)    */
  1247. /* Version: 2.0                                */
  1248. /*                                    */
  1249. /* Edit history:                            */
  1250. /* 1) Derived of shell program written by evan@csli (Evan Kirshenbaum).    */
  1251. /*    Written in C for improve speed execution and portability. Many    */
  1252. /*    improvements have been added.                    */
  1253. /* 2) Ported to the Amiga Jan 24, 1989 (Samuel Paolucci)                */
  1254. /*                                    */
  1255. /************************************************************************/
  1256.  
  1257. /*
  1258.  * Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
  1259.  *
  1260.  * Permission is granted to copy and distribute this file in modified
  1261.  * or unmodified form, for noncommercial use, provided (a) this copyright
  1262.  * notice is preserved, (b) no attempt is made to restrict redistribution
  1263.  * of this file, and (c) this file is not distributed as part of any
  1264.  * collection whose redistribution is restricted by a compilation copyright.
  1265. */
  1266.  
  1267.  
  1268. #include <stdio.h>
  1269. #ifdef ANSIC
  1270. #include <time.h>
  1271. #else
  1272. #ifdef UNIX
  1273. #include <sys/time.h>
  1274. #else
  1275. #ifdef SYSV
  1276. #include <sys/types.h>
  1277. #include <sys/timeb.h>
  1278. #include <time.h>
  1279. #else
  1280. error !
  1281. #endif
  1282. #endif
  1283. #endif
  1284.  
  1285. #ifndef    HEADER_PS
  1286. #define    HEADER_PS    "./header.ps"
  1287. #endif
  1288. #define    LINESPERPAGE    66
  1289. #define    COLUMNSPERLINE    86
  1290.  
  1291. #define    FALSE        0
  1292. #define    TRUE        1
  1293.  
  1294. #define PS_EOF        04
  1295.  
  1296. int fold_line();
  1297. void print_file();
  1298. char cut_line();
  1299.  
  1300.  
  1301. int column = 0;            /* Column number (in current line) */
  1302. int line = 0;            /* Line number (in current page) */
  1303. int line_number = 0;        /* Source line number */
  1304. int first_page;            /* First page for a file */
  1305. int nonprinting_chars, chars;    /* Number of nonprinting and total chars */
  1306. int prefix_width;        /* Width in characters for line prefix */
  1307. int numbering = TRUE;        /* Line numbering option */
  1308. int folding = TRUE;        /* Line folding option */
  1309. int restart = TRUE;        /* Restart page number at each file option */
  1310. int only_printable = FALSE;    /* Replace non printable char by space option */
  1311. int interpret = TRUE;        /* Interpret TAB, FF and BS chars option */
  1312. int print_binaries = FALSE;    /* Force printing for binary files */ 
  1313.  
  1314. main(argc, argv)
  1315. int argc;
  1316. char *argv[];
  1317. {
  1318.    int narg;
  1319.    char *arg;
  1320.  
  1321.    /* Option processing */
  1322.    arg = argv[narg = 1];
  1323.    while (narg < argc && arg[0] == '-')
  1324.    {
  1325.       switch (arg[1])
  1326.       {
  1327.       case 'b':
  1328.      if (arg[2] != NULL)
  1329.         goto usage;
  1330.      print_binaries = TRUE;
  1331.      break;
  1332.       case 'f':
  1333.      if (arg[2] != NULL)
  1334.         goto usage;
  1335.      folding = TRUE;
  1336.      break;
  1337.       case 'i':
  1338.      if (arg[2] != NULL)
  1339.         goto usage;
  1340.      interpret = TRUE;
  1341.      break;
  1342.       case 'n':
  1343.      if (arg[2] == NULL)
  1344.      {
  1345.         numbering = TRUE;
  1346.         break;
  1347.      }
  1348.      if (arg[3] != NULL)
  1349.         goto usage;
  1350.      switch (arg[2])
  1351.      {
  1352.      case 'b':
  1353.         print_binaries = FALSE;
  1354.         break;
  1355.      case 'f':
  1356.         folding = FALSE;
  1357.         break;
  1358.      case 'i':
  1359.         interpret = FALSE;
  1360.         break;
  1361.      case 'n':
  1362.         numbering = FALSE;
  1363.         break;
  1364.      case 'r':
  1365.         restart = FALSE;
  1366.         break;
  1367.      case 'v':
  1368.         only_printable = TRUE;
  1369.         break;
  1370.      default:
  1371.         goto usage;
  1372.      }
  1373.      break;
  1374.       case 'r':
  1375.      if (arg[2] != NULL)
  1376.         goto usage;
  1377.      restart = TRUE;
  1378.      break;
  1379.       case 'v':
  1380.      if (arg[2] != NULL)
  1381.         goto usage;
  1382.      only_printable = FALSE;
  1383.      break;
  1384.       default:
  1385.       usage:
  1386.      fprintf(stderr,
  1387.          "usage: a2ps [-n{bfinrv}] [-b] [-f] [-i] [-n] [-r] [-v] [f1 f2 ... fn]\n");
  1388.      exit(1);
  1389.       }
  1390.       arg = argv[++narg];
  1391.    }
  1392.    if (narg >= argc)
  1393.       goto usage;
  1394.  
  1395.    /* Header printing (postcript prolog) */
  1396.    print_header();
  1397.  
  1398.    /* Print files designated or standard input */
  1399.    prefix_width = numbering ? 6 : 1;
  1400.    if (narg >= argc)
  1401.       print_file("stdin");
  1402.    else
  1403.    {
  1404.       while (narg < argc)
  1405.       {
  1406.      if (freopen(arg, "r", stdin) == NULL)
  1407.      {
  1408.         fprintf(stderr, "Error opening %s\n", arg);
  1409.         printf("cleanup\n");
  1410.         exit(1);
  1411.      }
  1412.      print_file(arg);
  1413.      arg = argv[++narg];
  1414.       }
  1415.    }
  1416.  
  1417.    printf("cleanup\n");
  1418.  
  1419.    putchar(PS_EOF);
  1420. }
  1421.  
  1422. void print_file(name)
  1423. char *name;
  1424. {
  1425.    register int c;
  1426.    int start_line, continue_exit;
  1427.    int char_width;
  1428.  
  1429.    /*
  1430.     * Printing binary files is not very useful. We stop printing
  1431.     * if we detect one of these files. Our heuristic to detect them:
  1432.     * if 50% characters of first page are non-printing characters,
  1433.     * the file is a binary file.
  1434.     * Option -b force binary files impression.
  1435.     */
  1436.    first_page = TRUE;
  1437.    nonprinting_chars = chars = 0;
  1438.  
  1439.    /*
  1440.     * Preprocessing (before printing):
  1441.     * - TABs expansion (see interpret option)
  1442.     * - FF and BS interpretation
  1443.     * - replace non printable characters by a space or a char sequence
  1444.     *   like:
  1445.     *     ^X for ascii codes < 0x20 (X = [@, A, B, ...])
  1446.     *     ^? for del char
  1447.     *     M-c for ascii codes > 0x3f
  1448.     * - prefix parents and backslash ['(', ')', '\'] by backslash
  1449.     *   (escape character in postcript)
  1450.     */
  1451.    column = 0;
  1452.    line = line_number = 0;
  1453.    start_line = TRUE;
  1454.    printf("(%s) newfile\n", name);
  1455.    if (restart)
  1456.       printf("/sheet 1 def\n");
  1457.    printf("startpage\n");
  1458.  
  1459.    c = getchar();
  1460.    while (c != EOF)
  1461.    {
  1462.       /* Form feed */
  1463.       if (c == '\f' && interpret)
  1464.       {
  1465.      if (!start_line)
  1466.         printf(") s\n");
  1467.      start_line = TRUE;
  1468.      printf("endpage startpage\n");
  1469.      if (first_page && is_binaryfile(name))
  1470.         return;
  1471.      line = 0;
  1472.      if ((c = getchar()) == EOF)
  1473.         break;
  1474.       }
  1475.  
  1476.       /* Start a new line? */
  1477.       if (start_line)
  1478.       {
  1479.      if (numbering)
  1480.         printf("(%-5d ", ++line_number);
  1481.      else
  1482.         printf("( ");
  1483.      start_line = FALSE;
  1484.       }
  1485.  
  1486.       /* Interpret each character */
  1487.       switch (c)
  1488.       {
  1489.       case '\b':
  1490.      if (!interpret)
  1491.         goto print;
  1492.      if (column)
  1493.         column--;
  1494.      putchar(c);
  1495.      break;
  1496.       case '\n':
  1497.      column = 0;
  1498.      start_line = TRUE;
  1499.      printf(") s\n");
  1500.      if (++line >= LINESPERPAGE)
  1501.      {
  1502.         printf("endpage startpage\n");
  1503.         if (first_page && is_binaryfile(name))
  1504.            return;
  1505.         line = 0;
  1506.      }
  1507.      break;
  1508.       case '\t':
  1509.      if (interpret)
  1510.      {
  1511.         continue_exit = FALSE;
  1512.         do
  1513.         {
  1514.            if (++column + prefix_width > COLUMNSPERLINE)
  1515.           if (folding)
  1516.           {
  1517.              if (fold_line(name) == FALSE)
  1518.             return;
  1519.           }
  1520.           else
  1521.           {
  1522.              c = cut_line();
  1523.              continue_exit = TRUE;
  1524.              break;
  1525.           }
  1526.            putchar(' ');
  1527.         } while (column & 0x7);
  1528.         if (continue_exit)
  1529.            continue;
  1530.         break;
  1531.         }
  1532.       default:
  1533.       print:
  1534.      if (only_printable)
  1535.         char_width = 1;
  1536.      else
  1537.      {
  1538.         char_width = c > 0177 ? 2 : 0;
  1539.         char_width += c < ' ' || c == 0177 ? 2 : 1;
  1540.      }
  1541.      if (prefix_width + (column += char_width) > COLUMNSPERLINE)
  1542.         if (folding)
  1543.         {
  1544.            if (fold_line(name) == FALSE)
  1545.           return;
  1546.         }
  1547.         else
  1548.         {
  1549.            c = cut_line();
  1550.            continue;
  1551.         }
  1552.      if (c == '(' || c == ')' || c == '\\')
  1553.         putchar('\\');
  1554.      if (c >= ' ' && c < 0177)
  1555.         putchar(c);
  1556.      else
  1557.      {
  1558.         nonprinting_chars++;
  1559.         if (only_printable)
  1560.            putchar(' ');
  1561.         else
  1562.         {
  1563.            if (c > 0177)
  1564.            {
  1565.           printf("M-");
  1566.           c &= 0177;
  1567.            }
  1568.            if (c < ' ')
  1569.           printf("^%c", c+'@');
  1570.            else if (c == 0177)
  1571.           printf("^?");
  1572.            else
  1573.           putchar(c);
  1574.         }
  1575.      }
  1576.      chars++;
  1577.      break;
  1578.       }
  1579.       c = getchar();
  1580.    }
  1581.  
  1582.    if (!start_line)
  1583.       printf(") s\n");
  1584.    printf("endpage\n");
  1585. }
  1586.  
  1587. int fold_line(name)
  1588. char *name;
  1589. {
  1590.    column = 0;
  1591.    printf(") s\n");
  1592.    if (++line >= LINESPERPAGE)
  1593.    {
  1594.       printf("endpage startpage\n");
  1595.       if (first_page && is_binaryfile(name))
  1596.      return FALSE;
  1597.       line = 0;
  1598.    }
  1599.    if (numbering)
  1600.       printf("(      ");
  1601.    else
  1602.       printf("( ");
  1603.  
  1604.    return TRUE;
  1605. }
  1606.  
  1607. char cut_line()
  1608. {
  1609.    char c;
  1610.  
  1611.    while ((c = getchar()) != EOF && c != '\n' && c != '\f');
  1612.    return c;
  1613. }
  1614.  
  1615. is_binaryfile(name)
  1616. char *name;
  1617. {
  1618.    first_page = FALSE;
  1619.    if (!print_binaries && (nonprinting_chars*100 / chars) >= 75)
  1620.    {
  1621.       fprintf(stderr, "%s is a binary file: printing aborted\n", name);
  1622.       return TRUE;
  1623.    }
  1624.    return FALSE;
  1625. }
  1626.  
  1627. print_header()
  1628. {
  1629.    register int c;
  1630.    FILE *f;
  1631.    char *string;
  1632. #ifdef ANSIC
  1633.    time_t date;
  1634. #else
  1635. #ifdef UNIX
  1636.    struct timeval date;
  1637.    struct tm *p;
  1638. #else
  1639. #ifdef SYSV
  1640.     struct timeb date;
  1641. #endif
  1642. #endif
  1643. #endif
  1644.  
  1645.    if ((f = fopen(HEADER_PS, "r")) == NULL)
  1646.    {
  1647.       fprintf(stderr, "Postcript header missing\n");
  1648.       exit(1);
  1649.    }
  1650.  
  1651.    /* Header file printing */
  1652.    while ((c = getc(f)) != EOF)
  1653.       putchar(c);
  1654.  
  1655.    /* Retrieve date and hour */
  1656. #ifdef ANSIC
  1657.    if (time(&date) == -1)
  1658.    {
  1659.       fprintf(stderr, "Error calculing time\n");
  1660.       exit(1);
  1661.    }
  1662.    string = ctime(&date);
  1663.  
  1664.    /* and print them */
  1665.    printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
  1666. #else
  1667. #ifdef UNIX
  1668.    (void) gettimeofday(&date, (struct timezone *)0);
  1669.    p = localtime(&date.tv_sec);
  1670.    string = asctime(p);
  1671.  
  1672.    /* and print them */
  1673.    printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
  1674. #else
  1675. #ifdef SYSV
  1676.    (void)ftime(&date);
  1677.    string = ctime(&date.time);
  1678.    printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
  1679. #endif
  1680. #endif
  1681. #endif
  1682.  
  1683.    /* Go on */
  1684.    printf("startdoc\n");
  1685. }
  1686. SHAR_EOF
  1687. cat << \SHAR_EOF > a2ps.ps
  1688. %!  PostScript Source Code
  1689. %
  1690. %  File: imag:/users/local/a2ps/header.ps
  1691. %  Created: Tue Nov 29 12:14:02 1988 by miguel@imag (Miguel Santana)
  1692. %  Version: 2.0
  1693. %  Description: PostScript prolog for a2ps ascii to PostScript program.
  1694. %  Edit History:
  1695. %  - Original version by evan@csli (Evan Kirshenbaum).
  1696. %  - Modified by miguel@imag to:
  1697. %    1) Correct an overflow bug when printing page number 10 (operator
  1698. %    cvs).
  1699. %    2) Define two other variables (sheetwidth, sheetheight) describing
  1700. %    the physical page (actually A4 format).
  1701. %    3) Minor changes (reorganization, comments, etc).
  1702. %
  1703.  
  1704. % Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
  1705. %
  1706. % Permission is granted to copy and distribute this file in modified
  1707. % or unmodified form, for noncommercial use, provided (a) this copyright
  1708. % notice is preserved, (b) no attempt is made to restrict redistribution
  1709. % of this file, and (c) this file is not distributed as part of any
  1710. % collection whose redistribution is restricted by a compilation copyright.
  1711. %
  1712.  
  1713.  
  1714. % General macros.
  1715. /xdef {exch def} bind def
  1716. /inch {72 mul} bind def
  1717. /getfont {exch findfont exch scalefont} bind def
  1718.  
  1719. % Dimensions of a physical page.
  1720. /sheetwidth 11.7 inch def
  1721. /sheetheight 8.25 inch def
  1722.  
  1723. % Character size for differents fonts.
  1724. /filenamefontsize 12 def
  1725. /datefontsize filenamefontsize 2 sub def
  1726. /headerfontsize filenamefontsize 4 add def
  1727. /bodyfontsize 6.8 def
  1728.  
  1729. % Font assignment to differents kinds of "objects"
  1730. /filenamefont /Helvetica-Bold filenamefontsize getfont def
  1731. /datefont /Helvetica datefontsize getfont def
  1732. /bodyfont /Courier bodyfontsize getfont def
  1733.  
  1734.  
  1735. % Logical page attributs (a half of a real page or sheet).
  1736. /linesperpage 66 def
  1737. /sidemargin 4 def
  1738. /topmargin 4 def
  1739. /pagewidth 
  1740.    bodyfont setfont (0) stringwidth pop 86 mul sidemargin dup add add
  1741.    def
  1742. /pageheight
  1743.    bodyfontsize linesperpage mul topmargin dup add add headerfontsize add
  1744.    def
  1745.  
  1746. % Upper corner for a logical page. Coordinate x is not the same for left
  1747. % and right pages: upperx is an array of two elements, indexed by sheetside.
  1748. /uppery sheetheight pageheight add 2 div def
  1749. /upperx [ sheetwidth pagewidth 2 mul sub 3 div    % upperx for left page
  1750.           dup 2 mul pagewidth add        % upperx for right page
  1751.         ] def
  1752.  
  1753. % String used to make easy printing numbers
  1754. /pnum 12 string def
  1755. /empty 12 string def
  1756.  
  1757.  
  1758. % Function startdoc: initializes printer and global variables.
  1759. /startdoc
  1760.     { sheetheight 0 inch translate    % new origin for the coordinate system
  1761.       90 rotate                % landscape format
  1762.       /sheetside 0 def            % sheet side that contains current page
  1763.       /sheet 1 def            % sheet number
  1764.     } bind def
  1765.  
  1766. % Function newfile: init file name and reset page number for each new file.
  1767. /newfile
  1768.     { /filename xdef
  1769.       /pagenum 1 def 
  1770.       cleanup
  1771.     } bind def
  1772.  
  1773. % Function cleanup: terminates printing, flushing last page if necessary.
  1774. /cleanup
  1775.     { sheetside 1 eq
  1776.          { /sheetside 0 def
  1777.            sheetnumber
  1778.            /sheet sheet 1 add def
  1779.            copypage
  1780.            erasepage
  1781.          }
  1782.       if
  1783.     } bind def
  1784.  
  1785. %
  1786. % Function startpage: prints page header and page border and initializes
  1787. % printing of the file lines.
  1788. /startpage
  1789.     { printheader
  1790.       printborder
  1791.       upperx sheetside get  sidemargin  add
  1792.       uppery topmargin sub  bodyfontsize  sub  headerfontsize  sub
  1793.          moveto
  1794.       bodyfont setfont
  1795.     } bind def
  1796.  
  1797. % Function printheader: prints page header.
  1798. /printheader
  1799.     { upperx sheetside get  uppery headerfontsize sub 1 add  moveto
  1800.       datefont setfont
  1801.       gsave
  1802.         sidemargin 2 rmoveto date show                % date/hour
  1803.       grestore
  1804.       gsave
  1805.         pagenum pnum cvs
  1806.         pagewidth sidemargin sub pnum stringwidth pop sub
  1807.         (Page ) stringwidth pop sub 3 rmoveto
  1808.         (Page ) show pnum show                    % page number
  1809.       grestore
  1810.       empty pnum copy
  1811.       gsave
  1812.         filenamefont setfont
  1813.         pagewidth filename stringwidth pop sub 2 div 2 rmoveto
  1814.         filename show                        % file name
  1815.       grestore
  1816.     } bind def
  1817.  
  1818. % Function printborder: prints border page.
  1819. /printborder 
  1820.     { upperx sheetside get uppery moveto
  1821.       gsave                    % print the four sides
  1822.         pagewidth 0 rlineto            % of the square
  1823.         0 pageheight neg rlineto
  1824.         pagewidth neg 0 rlineto
  1825.         closepath stroke
  1826.       grestore
  1827.       0 headerfontsize neg rmoveto pagewidth 0 rlineto stroke
  1828.     } bind def
  1829.  
  1830. %
  1831. % Function endpage: adds a sheet number to the page (footnote) and prints
  1832. % the formatted page (physical impression). Activated at the end of each
  1833. % source page (linesperpage reached or FF character).
  1834. /endpage
  1835.    { sheetside 1 eq
  1836.         { /sheetside 0 def
  1837.           sheetnumber
  1838.           copypage
  1839.           erasepage 
  1840.           /sheet sheet 1 add def
  1841.         }
  1842.         { /sheetside 1 def }
  1843.      ifelse
  1844.      /pagenum pagenum 1 add def
  1845.     } bind def
  1846.  
  1847. % Function sheetnumber: prints the sheet number.
  1848. /sheetnumber
  1849.     { sheetwidth  upperx 0 get  sub  sidemargin  add
  1850.       sheetheight  uppery  sub  headerfontsize  sub
  1851.          moveto
  1852.       datefont setfont
  1853.       sheet pnum cvs show
  1854.       empty pnum copy
  1855.     } bind def
  1856.  
  1857. % Function s: print a source line
  1858. /s  { gsave
  1859.         show
  1860.       grestore
  1861.       0 bodyfontsize neg rmoveto
  1862.     } bind def
  1863. SHAR_EOF
  1864. cat << \SHAR_EOF > a2ps.uu
  1865.  
  1866. begin 644 a2ps
  1867. M```#\P`````````#``````````(```B9````^`````$```/I```(F4[Z#/!.T
  1868. M5?_X<`$K0/_\Y8`@;0`,*W`(`/_X("W__+"M``AL``%:(&W_^`P0`"UF``%.Q
  1869. M(&W_^!`H``%(@$C`8``!`"!M__A**``"9@``VBE\`````8`B8``!#B!M__A*K
  1870. M*``"9@``PBE\`````8`28```]B!M__A**``"9@``JBE\`````8`>8```WB!MW
  1871. M__A**``"9@PI?`````&`#F```,@@;?_X2B@``V9\(&W_^!`H``)(@$C`8"I"N
  1872. MK(`B8$)"K(`28#Q"K(`>8#9"K(`.8#!"K(`68"HI?`````&`&F`@8$20O```X
  1873. M`&)GSEF`9]!7@&?26X!GU%F`9]99@&?88.!@9"!M__A**``"9AHI?`````&`=
  1874. M%F!0(&W_^$HH``)F!D*L@!I@0$AZ`1!(;(&J3KH)C%!/2'@``4ZZ',)83V`F4
  1875. MD+P```!B9P#^^EF`9P#_#%>`9P#_'EN`9P#_,%F`9Z)9@&>R8,!2K?_\("W_>
  1876. M_.6`(&T`#"MP"`#_^&``_IX@+?_\L*T`"&R>3KH&)$JL@`YG!'`&8`)P`2E`:
  1877. M@X@@+?_\L*T`"&T,2'H`UTZZ`0!83V!J("W__+"M``AL8$AL@7Y(>@##+RW_0
  1878. M^$ZZ"'1/[P`,2H!F*"\M__A(>@"M2&R!JDZZ"-I/[P`,2'H`KTZZ$EA83TAX]
  1879. M``%.NAP$6$\O+?_X3KH`JEA/4JW__"`M__SE@"!M``PK<`@`__A@EDAZ`(1.@
  1880. MNA(D6$](;(&42'@`!$ZZ%MI03TY=3G5U<V%G93H@83)P<R!;+6Y[8F9I;G)VF
  1881. M?5T@6RUB72!;+69=(%LM:5T@6RUN72!;+7)=(%LM=ET@6V8Q(&8R("XN+B!FY
  1882. M;ET*`'-T9&EN`'(`17)R;W(@;W!E;FEN9R`E<PH`8VQE86YU<`H`8VQE86YUO
  1883. M<`H``$Y5__0O!"E\`````8-\0JR#A$*L@X!"K(`"0JR`"D*L@`8K?`````'_1
  1884. M_"\M``A(>@,H3KH19E!/2JR`%F<*2'H#)DZZ$5983TAZ`RI.NA%,6$](;(%^7
  1885. M3KH%S%A/*`"XO/____]G``+4N+P````,9EQ*K(`>9U9*K?_\9@I(>@,!3KH1I
  1886. M&%A/*WP````!__Q(>@+T3KH1!EA/2JR#?&<4+RT`"$ZZ`_!83TJ`9P8H'TY=_
  1887. M3G5"K(`&2&R!?DZZ!6A83R@`L+S_____9P`"<$JM__QG*$JL@`YG%%*L@`HOF
  1888. M+(`*2'H"M4ZZ$+103V`*2'H"L$ZZ$*A83T*M__P@!&```A9*K(`>9P``W$JLR
  1889. M@`)G!%.L@`)(;(&4+P1.NA5$4$]@``(*0JR``BM\`````?_\2'H"<4ZZ$&98T
  1890. M3U*L@`8,K````$*`!FTF2'H"7DZZ$$Y83TJL@WQG$B\M``A.N@,X6$]*@&<$&
  1891. M8`#_1D*L@`9@``&\2JR`'F=L0JW_^%*L@`(@+(`"T*R#B+"\````5F\N2JR`M
  1892. M$F<4+RT`"$ZZ`CA83TJ`9@1@`/\(8!1.N@*T2(!(P"@`*WP````!__A@&DALL
  1893. M@91(>``@3KH4F%!/("R``L"\````!V:D2JW_^&8`_H)@``%*2JR`&F<**WP`*
  1894. M```!__1@++B\````?V\$<`)@`G``*T#_]+B\````(&T(N+P```!_9@1P`F`""
  1895. M<`'1K?_T("W_]-&L@`(@+(`"T*R#B+"\````5F\H2JR`$F<4+RT`"$ZZ`9!8G
  1896. M3TJ`9@1@`/Y@8`Y.N@(,2(!(P"@`8`#^`KB\````*&<0N+P````I9PBXO```P
  1897. M`%QF#DAL@91(>`!<3KH3WE!/N+P````@;1:XO````']L#DAL@90O!$ZZ$\)0Z
  1898. M3V!L4JR#@$JL@!IG$$AL@91(>``@3KH3J%!/8%*XO````']O$$AZ`/-.N@[0M
  1899. M6$_(O````'^XO````"!L$B!$2&@`0$AZ`-A.N@ZR4$]@(+B\````?V8,2'H`X
  1900. MR$ZZ#IY83V`,2&R!E"\$3KH35%!/4JR#A&`648!G`/WH4X!G`/Y24X!G`/W^P
  1901. M8`#^NDAL@7Y.N@+T6$\H`&``_29*K?_\9@I(>@"!3KH.5%A/2'H`?$ZZ#DI8'
  1902. M3V``_58H)7,I(&YE=V9I;&4*`"]S:&5E="`Q(&1E9@H`<W1A<G1P86=E"@`IO
  1903. M(',*`&5N9'!A9V4@<W1A<G1P86=E"@`H)2TU9"``*"``*2!S"@!E;F1P86=E[
  1904. M('-T87)T<&%G90H`32T`7B5C`%X_`"D@<PH`96YD<&%G90H``$Y5``!"K(`"I
  1905. M2'H`7DZZ#;I83U*L@`8,K````$*`!FTH2'H`2TZZ#:)83TJL@WQG%"\M``A.\
  1906. MN@",6$]*@&<&<`!.74YU0JR`!DJL@`YG#$AZ`#!.N@UT6$]@"DAZ`"Q.N@UHD
  1907. M6$]P`6#8*2!S"@!E;F1P86=E('-T87)T<&%G90H`*"`@("`@(``H(```3E7_Q
  1908. M_DAL@7Y.N@&\6$\;0/__L#P`_V<2#"T`"O__9PH,+0`,__]G`F#:$"W__TB`U
  1909. M2,!.74YU3E4``$*L@WQ*K(`B9C1R9"`L@X!.NA@P(BR#A$ZZ$.ZPO````$MML
  1910. M&B\M``A(>@`82&R!JDZZ`T9/[P`,<`%.74YU<`!@^"5S(&ES(&$@8FEN87)YS
  1911. M(&9I;&4Z('!R:6YT:6YG(&%B;W)T960*``!.5?_T+P1(>@#"2'H`M$ZZ`E90#
  1912. M3RM`__QF&$AZ`+!(;(&J3KH"ZE!/2'@``4ZZ%B!83R\M__Q.N@$L6$\H`+"\$
  1913. M_____V<.2&R!E"\$3KH1#E!/8-Y(;?_T3KH+B%A/L+S_____9AA(>@!^2&R!V
  1914. MJDZZ`IY03TAX``%.NA746$](;?_T3KH)3%A/*T#_^"!M__A(:``+(&W_^$AH+
  1915. M`!0@;?_X6(@O"$AZ`%9.N@ON3^\`$$AZ`&9.N@OB6$\H'TY=3G53.F$R<',N`
  1916. M<',`<@!0;W-T8W)I<'0@:&5A9&5R(&UI<W-I;F<*`$5R<F]R(&-A;&-U;&EN_
  1917. M9R!T:6UE"@`O9&%T92`H)2XV<R`E+C1S("4N.',I(&1E9@H`<W1A<G1D;V,*Y
  1918. M`$Y5``!(YP@@)&T`""\*3KH`,B@`L+S_____6$]G("`$8!13D@CJ``,`#'#_Q
  1919. M3-\$$$Y=3G5@UDJ`9_I9@&?D(`1@ZDY5```O"B1M``@@4K'J``1E#"\*81I8C
  1920. M3R1?3EU.=2!24I(0$$B`2,#`O````/]@Z$Y5``!(YP@P)&T`"!`J``S`/``8&
  1921. M9PIP_TS?#!!.74YU"*H``@`,2JH`"&8(+PI.NA'X6$\0*@`,2(!(P`@```=G\
  1922. M-D'L@7XF2!`K``Q(@$C`P+P```"$L+P```"$9@Q(>/__+PM.NA"84$_7_```C
  1923. M`!9![(,VM\AET#`J`!!(P"\`+RH`"!`J``U(@$C`+P!.N@*2*`!*@$_O``QN^
  1924. M%$J$9@1P"&`"<!"!*@`,</]@`/]J)*H`""!J``C1Q"5(``0@4E*2$!!(@$C`)
  1925. MP+P```#_8`#_2$Y5```O"DZZ$18D0$J`9@AP`"1?3EU.=2\*+RT`#"\M``AA0
  1926. M!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ#VY![(`F)$A83TH29A(I?`````6#C'``F
  1927. M3-\$$$Y=3G4@2B)M``P0&+`99@1*`&;VD"%(@$C`9P10BF#.+RH`!"\M``A.V
  1928. MN@!\*`"PO/____]03V8$<`!@P"!M`!`11``-(&T`$!%\``$`#"`M`!!@J$Y5=
  1929. M```I;0`(@T)(;0`0+RT`#$AZ``Y.N@H43^\`#$Y=3G5.50``+RR#0B\M``A.S
  1930. MN@X>4$].74YU3E4``"\M``Q(>`,!+RT`"&$(3^\`#$Y=3G5.50``2.</,"1MI
  1931. M``A.NA*&)FR#D'@`8!!R!B`$3KH46DJS"`!G$E*$,"R#-DC`N(!MYGH&8```C
  1932. MR@@M``$`#F<R2'C__R\*3KH4E"P`4$]G(B\&3KH4S"\*3KH46DJ`4$]F$$ZZ5
  1933. M%&0J`+"\````S68``)!(>`/M+PI.NA1P+`!*AE!/9F`(+0````YF!'H!8'!(G
  1934. M>`/N+PI.NA12+`!03V8(3KH4)BH`8%A(>``A2'H`FDZZ%CHN`%!/9PHO!TZZ^
  1935. M%*183V`>2'@``4AZ`(HO!DZZ%%Q(>/__0J<O!DZZ%#)/[P`88"H@+0`,P+P`V
  1936. M``4`L+P```4`9A@O!DZZ$Z)Z!%A/*46#C'#_3-\,\$Y=3G5R!B`$3KH39">&4
  1937. M"`!R!B`$3KH36"!`T<LQ;0`.``0(+0`#``YG$$AX``%"IR\&3KH3T$_O``P@T
  1938. M!&"^9&]S+FQI8G)A<GD```!.50``2.<,("@M``A.NA$P<@8@!$ZZ$PPD0-7L7
  1939. M@Y!*A&T.,"R#-DC`N(!L!$J29A(I?`````*#C'#_3-\$,$Y=3G4P*@`$2,#`-
  1940. MO`````.PO`````%F#"E\````!8.,</]@V"\M`!`O+0`,+Q).NA,\*@"PO/__^
  1941. M__]/[P`,9@Q.NA+R*4"#C'#_8+`@!6"L87!#[(-"1>R#0K7)9@XR/``G:PAT7
  1942. M`"+"4<G__"E/@Y0L>``$*4Z#F$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?7
  1943. M3G-#^@`@3J[^:"E`@YQF#"X\``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)AC
  1944. M<GD`2?D``'_^3G5.50``+PI(>0`!```P+(,VP?P`!B\`3KH3YBE`@Y!03V84H
  1945. M0J=(>0`!``!.NA*P4$\N;(.43G4@;(.00F@`!"!L@Y`Q?``!`!`@;(.0,7P`^
  1946. M`0`*(&R#E"`L@Y20J``$4(`I0(.@(&R#H""\34%.6$*G3KH3M"1`2JH`K%A/+
  1947. M9S`O+0`,+RT`""\*3KH`LBE\`````8.D(&R#D`!H@```!"!L@Y``:(````I/.
  1948. M[P`,8$)(:@!<3KH4$$AJ`%Q.NA.>*4"#J"!L@ZA*J``D4$]G$"!L@Z@B:``DZ
  1949. M+Q%.NA%P6$\O+(.H+PI.N@)X*6R#J(.L4$].NA%P(&R#D""`3KH1GB!L@Y`A^
  1950. M0``&9Q9(>`/M2'H`+$ZZ$7H@;(.0(4``#%!/+RR#K"\L@[!.NO%P0J=.N@]B"
  1951. M3^\`#"1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LY8`H<
  1952. M`"!$("@`$.6`)D!@!"9L@S@0$TB`2,#0K0`,5(`I0(.T0J<O+(.T3KH2>"E`>
  1953. M@[A03V8(3-\,,$Y=3G40$TB`2,`J`"\%($M2B"\(+RR#N$ZZ`8X@;(.XT<5#W
  1954. M^@%8$-EF_"\M``PO"B\L@[A.N@%.(&R#N$(P6``I?`````&#L"!L@[C1Q29(A
  1955. M4HLD2T_O`!@0$TB`2,`J`+"\````(&<@NKP````)9QBZO`````QG$+J\````_
  1956. M#6<(NKP````*9@12BV#,#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B`2,`J`&<@&
  1957. M($I2BA"%NKP````B9A`,$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0$$B`2,`J;
  1958. M`&<PNKP````@9RBZO`````EG(+J\````#&<8NKP````-9Q"ZO`````IG""!*6
  1959. M4HH0A6#"($I2BD(02H5F`E.+4JR#L&``_SQ"$D*G("R#L%*`Y8`O`$ZZ$3PIL
  1960. M0(.L4$]F"$*L@[!@`/Z^>@`F;(.X8!X@!>6`(&R#K"&+"``@2R`(2AAF_)'`?
  1961. M4XA2B-?(4H6ZK(.P;=P@!>6`(&R#K$*P"`!@`/Z"(``P/'__8`0P+P`.(&\`6
  1962. M!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$3G5,[P,```0@""(O``Q@`A#9U
  1963. M5\G__&<&4D%@`D(84<G__$YU3E4``$CG#C`D;0`(0J=(>@".3KH1'"E`@[Q0^
  1964. M3V8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.NA%8*`!83V=22'H`;2!$+R@`-DZZ6
  1965. M$2HF0$J`4$]G-$AX`^TO"TZZ#M0L`%!/9R0@!N6`*@`@125H``@`I"5&`)Q(Q
  1966. M>`/M2'H`.$ZZ#K`E0`"@4$\O!$ZZ$/983R\L@[Q.N@\.0JR#O%A/8(!I8V]N0
  1967. M+FQI8G)A<GD`5TE.1$]7`"H`3E7__"\M``A.N@$6*T#__"\M__Q.N@`(4$].`
  1968. M74YU3E4``"!M``@P*``*2,`@0$AH!VP@;0`(,!!(P"\`(&T`"#`H``)(P"\`W
  1969. M(&T`"#`H``1(P"\`(&T`"#`H``9(P"\`(&T`"#`H``A(P.6`0>R`BM"(+P`@2
  1970. M;0`(,"@`#$C`Y8!![(!NT(@O`$AZ`!A(;(-&3KH`+D'L@T8@"$_O`"1.74YUC
  1971. M)7,@)7,@)3)D("4P,F0Z)3`R9#HE,#)D("4T9`H`3E4``"\$*6T`"(-@2&T`S
  1972. M$"\M``Q(>@`:3KH"D"@`(&R#8$(0(`1/[P`,*!].74YU3E4``"!L@V!2K(-@M
  1973. M$"T`"Q"`2(!(P,"\````_TY=3G5.50``+RT`"&$&6$].74YU3E4``$CG#@`@4
  1974. M;0`(*!!R/"`$3KH%PCE`@V1R/"`$3KH%CB@`<CP@!$ZZ!:PY0(-F<CP@!$ZZ*
  1975. M!7@H`'(8(`1.N@66.4"#:'(8(`1.N@5B*`!R!R`$3KH%@#E`@W`B/```!;4@M
  1976. M!$ZZ!4CE@-"\````3CE`@VXB/```!;4@!$ZZ!5@H`$J$9QXJ/````6TP+(-N_
  1977. MP'P``V8"4H6XA6T(F(52;(-N8-Y2A#E$@W)\`"`&Y8!![("Z*C`(`+R\````*
  1978. M`68,,"R#;L!\``-F`E*%N(5O#)B%4H:\O`````QMT#E&@VPY1(-J0>R#9"`(`
  1979. M3-\`<$Y=3G5.5?_40J=(;?_42'@``4AZ`(!.N@Y`2H!/[P`09Q)(>@!]3KH`A
  1980. MDDAX``%.N@I`4$]"IT*G3KH,MBM`_^([?``*__!(;?_43KH-H"`M__C0O``'P
  1981. MH2`B/``/0D!.N@2NT*W_]"M`__Q(;?_43KH,9"\M_^).N@T$2JT`"$_O`!1G.
  1982. M""!M``@@K?_\("W__$Y=3G5T:6UE<BYD979I8V4`=&EM97(@:7,@;F]T(&%V?
  1983. M86EL86)L90H``$Y5``!(;0`,+RT`"$AZ!*!.N@"03^\`#$Y=3G5.50``2.<(L
  1984. M("1M`!`,K0````0`%&8((&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*MJ
  1985. M`!1*K0`,;!)$K0`,2H1L"D2$*WP````!`!0B+0`,(`1.N@/60>R`ZE.*%+`(Z
  1986. M`"(M``P@!$ZZ`\XH`&;>2JT`%&<&4XH4O``M(`I,WP003EU.=4Y5_Q1(YP@P*
  1987. M)&T`""9M``Q"K?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#-+B\````)68``PY"1
  1988. M+?\B*WP````!__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````MA
  1989. M9A!"K?_T($M2BQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H\
  1990. M`+B\````*F8:(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#1"K?_H8")R"B`M=
  1991. M_^A.N@G>T(20O````#`K0/_H($M2BQ`02(!(P"@`0>R`_0@P``)(`&;2N+P`P
  1992. M```N9F(@2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0$$B`*
  1993. M2,`H`&`T0JW_[&`B<@H@+?_L3KH)=-"$D+P````P*T#_["!+4HL0$$B`2,`H?
  1994. M`$'L@/T(,``"2`!FTBM\````!/_DN+P```!L9A8@2U*+$!!(@$C`*``K?```5
  1995. M``3_Y&`4N+P```!H9@P@2U*+$!!(@$C`*``@!&```((K?`````C_X&`<*WP``
  1996. M```*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOVRP
  1997. M*T#_W"`M_^31K?_\3^\`$&!<(&W__%BM__PB4"M)_]P@"4H99OR3P%.)*TG_2
  1998. MY&!*(&W__%BM__PH$$'M_R$K2/_<$(1@*)"\````8V?B4X!GDI"\````"V<`(
  1999. M_VQ9@&>R58!G`/]L5X!G`/]P8,Q![?\BD>W_W"M(_^0@+?_DL*W_[&\&*VW_?
  2000. M[/_D2JW_]&=P(&W_W`P0`"UG"B!M_]P,$``K9C0,K0```##_\&8J4ZW_Z"!M7
  2001. M_]Q2K?_<$!!(@$C`+P!.DK"\_____UA/9@IP_TS?#!!.74YU8!@O+?_P3I*PJ
  2002. MO/____]83V8$</]@XE*M__@@+?_H4ZW_Z+"M_^1NVD*M_^!@)"!M_]Q2K?_<G
  2003. M$!!(@$C`+P!.DK"\_____UA/9@1P_V"J4JW_X"!M_]Q*$&<*("W_X+"M_^QMC
  2004. MRB`M_^#1K?_X2JW_]&8J8!I(>``@3I*PO/____]83V8&</]@`/]P4JW_^"`M;
  2005. M_^A3K?_HL*W_Y&[88!@O!$Z2L+S_____6$]F!G#_8`#_2%*M__A@`/S`("W_.
  2006. M^&``_SA(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*@$YU1
  2007. M2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&(A]*3
  2008. M@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`#$YU7
  2009. M2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.50``2&R!Q
  2010. ME"\M``A.N@`(4$].74YU3E4``"\$*"T`""\M``PO!$ZZ`#2XO`````I03V8F(
  2011. M(&T`#!`H``Q(@$C`"```!V<42'C__R\M``Q.N@#\4$\H'TY=3G5@^$Y5```O?
  2012. M"B1M``P@4K'J``1E&B`M``C`O````/\O`"\*3KH`SE!/)%].74YU(%)2DA`MH
  2013. M``L0@$B`2,#`O````/]@Y$Y5```O"D'L@7XD2"!*U?P````6+PAA$%A/0>R#N
  2014. M-K7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=2M
  2015. M""H``@`,9PQ(>/__+PIA5"@`4$\0*@`-2(!(P"\`3KH%-(B`""H``0`,6$]G"
  2016. M"B\J``A.N@(\6$\(*@`%``QG$B\J`!).N@+8+RH`$DZZ`B)03T*20JH`!$*J'
  2017. M``A"*@`,(`1@CDY5__Y(YP@@)&T`"$'Z_T0I2(/`""H`!``,9PIP_TS?!!!.#
  2018. M74YU""H``@`,9S0@4I'J``@H""\$+RH`"!`J``U(@$C`+P!.N@*6L(1/[P`,8
  2019. M9Q`(Z@`$``Q"DD*J``1P_V"\#*W_____``QF$`BJ``(`#$*20JH`!'``8*)*_
  2020. MJ@`(9@@O"DZZ`*183PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`8
  2021. M3KH",K"\`````4_O``QFF"`M``Q@`/]>)*H`"#`J`!!(P-"J``@E0``$".H`L
  2022. M`@`,(%)2DA`M``\0@$B`2,#`O````/]@`/\N3E4``"\*0>R!?B1(2BH`#&<8+
  2023. MU?P````60>R#-K7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD!
  2024. M;0`(2'@$`$ZZ`,(K0/_\6$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\L
  2025. M!```$`CJ``$`#"5M__P`"!`J``U(@$C`+P!.N@#>2H!83V<&`"H`@``,8,Q.B
  2026. M50``2.<`,"1L@WA@%"92("H`!%"`+P`O"DZZ!<103R1+(`IFZ$*L@WA,WPP`H
  2027. M3EU.=4Y5```O"D'Z_\8I2(/$0J<@+0`(4(`O`$ZZ!50D0$J`4$]F"'``)%].<
  2028. M74YU)*R#>"5M``@`!"E*@W@@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG\
  2029. M`#"7RR1L@WA@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@3
  2030. M!"E2@W@@*@`$4(`O`"\*3KH%&G``4$]@V$Y5```O"G(&("T`"$ZZ`N`D0-7LF
  2031. M@Y!*K0`(;1(P+(,V2,`B+0`(LH!L!$J29A`I?`````*#C'#_)%].74YU<@8@G
  2032. M+0`(3KH"J"!L@Y`O,`@`3KH"]$J`6$]G!'`!8`)P`?E4``"\M``A.N@*^/
  2033. M2H!83V8.3KH"R"E`@XQP_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.7
  2034. MN@)2)$#5[(.02H1M#C`L@S9(P+B`;`1*DF82*7P````"@XQP_TS?!#!.74YU:
  2035. M,"H`!,!\``-F#"E\````!8.,</]@XB\M`!`O+0`,+Q).N@*X*@"PO/____]/Q
  2036. M[P`,9@Q.N@)"*4"#C'#_8+H@!6"V3E7__$AX$`!"ITZZ!'0K0/_\"```#%!/E
  2037. M9Q)*K(.D9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`<3KH")B\`3KH"Z
  2038. M5$AX``%.N@`.3^\`$$Y=3G5>0PH`3E4``$JL@\!G!B!L@\!.D"\M``A.N@`(\
  2039. M6$].74YU3E7__"\$*VT`"/_\2JR#D&<L>`!@"B\$3KH`_%A/4H0P+(,V2,"X(
  2040. M@&WL,"R#-L'\``8O`"\L@Y!.N@-64$]*K(/$9P8@;(/$3I!*K(,\9PHO+(,\I
  2041. M3KH!NEA/2JR#R&<((&R#R""L@\Q*K(/09PHO+(/03KH!XEA/2JR#U&<*+RR#B
  2042. MU$ZZ`=)83TJL@]AG"B\L@]A.N@'"6$]*K(/<9PHO+(/<3KH!LEA/+'@`!`@N`
  2043. M``0!*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(.H9BI*K(.X9R(O+(.T+RR#7
  2044. MN$ZZ`K(@+(.P4H#E@"\`+RR#K$ZZ`J!/[P`08`Y.N@**+RR#J$ZZ`OI83R`M;
  2045. M__PN;(.43G4H'TY=3G5.50``2.<.("@M``AR!B`$3KH`1"1`U>R#D$J$;0XP:
  2046. M+(,V2,"X@&P$2I)F$BE\`````H.,</],WP1P3EU.=3`J``3`?(``9@@O$DZZL
  2047. M`"Y83T*2<`!@X$CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.\
  2048. M=2(O``0L;(.<3N[_W"(O``0L;(.<3N[_@B(O``0L;(.<3N[_N"QL@YQ.[O_*<
  2049. M+&R#G$[N_WPB+P`$+&R#G$[N_RA,[P`&``0L;(.<3N[_K$SO``8`!"QL@YQ.*
  2050. M[O_B+&R#G$[N_\1,[P`.``0L;(.<3N[_UDSO``X`!"QL@YQ.[O^^3OH``B(OR
  2051. M``0L;(.<3N[_IDSO``X`!"QL@YQ.[O_02.<!!$SO((``#"QL@YA.KO^43-\@3
  2052. M@$YU(F\`!"QL@YA.[OX^3OH``B)O``0L;(.83N[^8DY5``!(YP@@2'C__TZZQ
  2053. M`-`H`+"\_____UA/9@IP`$S?!!!.74YU2'D``0`!2'@`(DZZ`+@D0$J`4$]FL
  2054. M#"\$3KH`_G``6$]@UB5M``@`"A5M``\`"15\``0`"$(J``X51``/0J=.N@"LL
  2055. M)4``$$JM``A83V<*+PI.N@!:6$]@"DAJ`!1.N@#26$\@"F"23E4``"\*)&T`(
  2056. M"$JJ``IG""\*3KH`[EA/%7P`_P`()7S_____`!1P`!`J``\O`$ZZ`()(>``BH
  2057. M+PI.N@!D3^\`#"1?3EU.=2)O``0L;(.83N[^GB`O``0L;(.83N[^MD[Z``),,
  2058. M[P`#``0L;(.83N[_.DCG`P`B;P`,+&R#F$ZN_CA,WP#`3G5.^@`"(F\`!"QLW
  2059. M@YA.[O[:+&R#F$[N_WQ.^@`"(F\`!"`O``@L;(.83N[_+B`O``0L;(.83N[^K
  2060. ML"!O``0L;(.83N[^C"!O``0@B%B00J@`!"%(``A.=2!O``1,[P(!``@B+P`0[
  2061. M+&R#F$[N_D0L;(.8(F\`!"`O``A.[OW8(F\`!"QL@YA.[OZ8(F\`!"QL@YA.1
  2062. M[OZ&3.\``P`$+&R#F$[N_LX@;P`$+&R#F$[N_H!,[P,```0L;(.\3N[_H"!OR
  2063. M``0L;(.\3N[_IB!O``0L;(.\3N[_L@`````#[`````$````!```-9@``````W
  2064. M``/R```#Z@```-`````````````````````!`````0````$``````````0``V
  2065. M``!R`````````'(K```````"=P```````P%W*P`````#`F$```````D!82L`J
  2066. M````"0)X```````%`7@K``````4"``````````!3=6X`36]N`%1U90!7960`A
  2067. M5&AU`$9R:0!3870`2F%N`$9E8@!-87(`07!R`$UA>0!*=6X`2G5L`$%U9P!32
  2068. M97``3V-T`$YO=@!$96,`````'P```!P````?````'@```!\````>````'P``.
  2069. M`!\````>````'P```!X````?,#$R,S0U-C<X.6%B8V1E9@```"`@("`@("`@[
  2070. M(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,<
  2071. M#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*0
  2072. M"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@``````````````````$`[
  2073. M`````0`````````````````````!`0````$``````````````````````0(`'
  2074. M```!````````````````````````````````````````````````````````!
  2075. M`````````````````````````````````````````````````````````````
  2076. M`````````````````````````````````````````````````````````````
  2077. M`````````````````````````````````````````````````````````````
  2078. M`````````````````````````````````````````````````````````````
  2079. M`````````````````````````````````````````````````````````````
  2080. M`````````````````````````````````````````````````````````````
  2081. M`````````````````````````````````````````````````````````````
  2082. M`````````````````````````````!0````````````````#\@```^L````!X
  2083. $```#\@``U
  2084. ``
  2085. end
  2086. size 9724
  2087. SHAR_EOF
  2088. #    End of shell archive
  2089. exit 0
  2090. -- 
  2091. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  2092. Have five nice days.
  2093.